<?php
/*
 * ==BeLean==
 * This file is part of the BeLean project!
 * 
 * BBS Brinkstrasse Osnabrück
 * @author	Marco Kreienbrink <marco.kreienbrink@googlemail.com>
 *  
 *
 *  Klasse für die Verwaltung und Verwendung der Konfigurationsparameter.
 *  
 *  Achtung! 
 *  Da es jeweils nur ein Config Objekt geben soll wurde hier das Singleton Pattern verwendet!
 *  
 *  Um ein neues Config Objekt zu erstellen wird demzufolge auch nicht der Kontruktor aufgerufen sondern die Methode 
 *  getConfig()!
 *  
 *  Beispiel: 
 *  	$meinConfigObjekt = config::getConfig();
 */

    class config{
        static private $instance = null;				
        private $fileName="../inc/config.inc.php";
        private $conf;

	        /**
         * Der Konstruktor kontrolliert zuerst ob die oben angegebene Config Datei existiert und bindet diese dann gegebenenfalls ein.
         * Ab diesem Zeitpunkt kann auf die einzelnen Parameter zugegriffen werden.
        */
        private function __construct(){
            if(is_file($this->fileName)){
                include $this->fileName;
            }else{
            	// TODO :
                /* Config Datei scheint noch nicht zu existieren....
                  Datei neu erstellen und eventuell einen Vermerk in die Log Datei dass eine neue
                  Config Datei angelegt wurde...?
               */
            }
        }


        /**
         * Quasi der Ersatz für den nicht öffentlichen Konstruktor.
         * Kontrolliert ob bereits ein Config Objekt erstellt wurde und gibt dieses gegebenenfalles zurück oder erstellt ein neues
         * und gibt dann dieses zurück.
        */
        public static function getConfig(){
            if(self::$instance === NULL){
                self::$instance = new self;
            } 
			if(self::$instance->getValue("home_path")==""){				
				self::$instance->setValue("home_path",(substr(getcwd(),0,strpos(getcwd(),"BeLean")+strlen("BeLean"))));
				self::$instance->saveConfig();
			}           
            return self::$instance;
        }

		/**
		 * Wie bereits erwähnt soll es ja immer nur ein Config Objekt geben, deshalb muss/wird hier auch das Clonen des Objektes
		 * unterbunden. 
		 */
        private function __clone(){}
        

        /**
         *Auslesen eines bestimmten Config Parameters
         *zB.: $meinConfigObjekt->getValue('STRING')
         *
         *@param    string $key Arraykey
         *@return   string Config Parameter
        */
        public function getValue($key){
            if(self::$instance !== NULL){
                if(array_key_exists($key,$this->conf)){
                    return $this->conf[$key];
                }
            }
        }

        /**
         *Funktion um einen neuen Config Parameter zu setzen, bezihungsweise einen bestehenden zu überschreiben.
         *Achtung! Diese Methode behandelt lediglich das instantierte Objekt, also nur das Abbild im Speicher!
         *Damit die Änderungen nicht verlohren gehen müssen diese noch mit $this->saveConfig() gespeichert werden.
         *
         *@param string $key Array Key
         *@param string $value Array Value
      */
        public function setValue($key,$value){
            if(self::$instance !== NULL){
                $this->conf[$key] = $value;
            }
        }

        /**
         *Speichert das Config Objekt zurück in die Datei.
         *
        */
        public function saveConfig(){
          file_put_contents($this->fileName,"<?php \n\$this->conf=".var_export($this->conf,true).";\n?>");
        }


    }
